1 : <?php
2 : /*--------------------------------------------------------------------------+
3 : This file is part of eStudy.
4 : planspiel/classes/class.phase.inc.php
5 : - Modulgruppe: Planspiel
6 : - Beschreibung: Erstellen eines Phasen-Objektes mit entsprechenden Funktionen.
7 : - Version: 0.8, 13/01/07
8 : - Autor(en): Clemens Weiß <clemens.weiss@mni.fh-giessen.de>
9 : +---------------------------------------------------------------------------+
10 : This program is free software; you can redistribute it and/or
11 : modify it under the terms of the GNU General Public License
12 : as published by the Free Software Foundation; either version 2
13 : of the License, or any later version.
14 : +---------------------------------------------------------------------------+
15 : This program is distributed in the hope that it will be useful,
16 : but WITHOUT ANY WARRANTY; without even the implied warranty of
17 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 : GNU General Public License for more details.
19 : You should have received a copy of the GNU General Public License
20 : along with this program; if not, write to the Free Software
21 : Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 : +--------------------------------------------------------------------------*/
23 : /**
24 : * Erstellen eines Phasen-Objektes mit entsprechenden Funktionen.
25 : * @package eStudy.Planspiel
26 : * @version 0.8, 13/01/07
27 : * @author Clemens Weiß <clemens.weiss@mni.fh-giessen.de>
28 : */
29 1 : require_once ("class.bbcode.inc.php");
30 1 : require_once ("class.formular.inc.php");
31 1 : require_once ("class.userrolemanagement.inc.php");
32 1 : require_once ("class.userteammanagement.inc.php");
33 1 : require_once ("class.teamlist.inc.php");
34 1 : require_once ("class.team.inc.php");
35 1 : require_once ("class.insert.inc.php");
36 1 : require_once ("class.filemanger.inc.php");
37 1 : require_once ("class.dateselection.inc.php");
38 1 : require_once ("class.phase.inc.php");
39 1 : require_once ("class.PlanspielBudget.inc.php");
40 1 : require_once ("class.BudgetIndicators.inc.php");
41 :
42 1 : class Document {
43 : /**
44 : * ID des Dokuments
45 : * @var int
46 : * @access private
47 : */
48 : var $ID;
49 : /**
50 : * ID der Phase, zu der das Dokument gehört
51 : * @var int
52 : * @access private
53 : */
54 : var $phaseID;
55 : /**
56 : * ID des Planspiels, zu dem das Dokument gehört
57 : * @var int
58 : * @access private
59 : */
60 : var $planspielID;
61 : /**
62 : * Name des Dokuments
63 : * @var string
64 : * @access private
65 : */
66 : var $name;
67 : /**
68 : * Beschreibung des Dokuments
69 : * @var string
70 : * @access private
71 : */
72 : var $description;
73 : /**
74 : * Typ des Dokuments (ID aus der Tabelle planspiel_doc_type)
75 : * @var int
76 : * @access private
77 : */
78 : var $type;
79 : /**
80 : * Datei-ID der Vorlage für dieses Dokument aus dem Ressourcen-Manager
81 : * @var int
82 : * @access private
83 : */
84 : var $templateID;
85 : /**
86 : * ID des Verzeichnisses, in dem das Dokument gespeichert werden soll
87 : * @var int
88 : * @access private
89 : */
90 : var $folderID;
91 : /**
92 : * ID der Datei, die zu diesem Dokument gehört bzw. es darstellt
93 : * @var int
94 : * @access private
95 : */
96 : var $fileID;
97 : /**
98 : * User-ID des Bearbeiters dieses Dokuments
99 : * @var int
100 : * @access private
101 : */
102 : var $editorUserID;
103 : /**
104 : * User-ID des Reviewers dieses Dokuments
105 : * @var int
106 : * @access private
107 : */
108 : var $reviewerUserID;
109 : /**
110 : * Timestamp, seit dem das Dokument in Bearbeitung ist
111 : * @var int
112 : * @access private
113 : */
114 : var $inProgressSince;
115 : /**
116 : * Kommentar zum Status "In Bearbeitung"
117 : * @var string
118 : * @access private
119 : */
120 : var $inProgressComment;
121 : /**
122 : * Timestamp, seit dem das Dokument bereit zur Abnahme ist
123 : * @var int
124 : * @access private
125 : */
126 : var $readyForApprovalSince;
127 : /**
128 : * Kommentar zum Status "Bereit zur Abnahme"
129 : * @var string
130 : * @access private
131 : */
132 : var $readyForApprovalComment;
133 : /**
134 : * Timestamp, an dem um Feedback gebeten wurde
135 : * @var int
136 : * @access private
137 : */
138 : var $feedbackRequestSince;
139 : /**
140 : * Kommentar zum Status "Feedback erbeten"
141 : * @var string
142 : * @access private
143 : */
144 : var $feedbackRequestComment;
145 : /**
146 : * Timestamp, seit dem das Dokument als akzeptiert gilt
147 : * @var int
148 : * @access private
149 : */
150 : var $acceptedSince;
151 : /**
152 : * Kommentar zum Status "Akzeptiert"
153 : * @var string
154 : * @access private
155 : */
156 : var $acceptedComment;
157 : /**
158 : * Timestamp, bis zu dem das Dokument überarbeitet werden muss
159 : * @var int
160 : * @access private
161 : */
162 : var $reviseUntil;
163 : /**
164 : * Kommentar zum Status "Überarbeitung erbeten"
165 : * @var string
166 : * @access private
167 : */
168 : var $reviseComment;
169 : /**
170 : * Timestamp, an dem die Überarbeitung des Dokuments gewünscht wurde
171 : * @var int
172 : * @access private
173 : */
174 : var $reviseTS;
175 : /**
176 : * Timestamp, an dem ein Change Request gestellt wurde
177 : * @var int
178 : * @access private
179 : */
180 : var $changeRequestSince;
181 : /**
182 : * Kommentar zum Status "Change Request"
183 : * @var string
184 : * @access private
185 : */
186 : var $changeRequestComment;
187 : /**
188 : * Geschätzter Aufwand in Personentagen
189 : * @var float
190 : * @access private
191 : */
192 : var $estimatedEffort;
193 : /**
194 : * Timestamp der Schätzung des Aufwands
195 : * @var int
196 : * @access private
197 : */
198 : var $estimatedEffortTS;
199 : /**
200 : * Bisherige aufgewendete Personentage
201 : * @var float
202 : * @access private
203 : */
204 : var $daysSpent;
205 : /**
206 : * Timestamp der letzten Änderung des bisherigen Aufwands
207 : * @var int
208 : * @access private
209 : */
210 : var $daysSpentTS;
211 : /**
212 : * Erwartete Zeit zur Fertigstellung in Personentagen
213 : * @var float
214 : * @access private
215 : */
216 : var $etc;
217 : /**
218 : * Timestamp der letzten Änderung des ETC
219 : * @var int
220 : * @access private
221 : */
222 : var $etcTS;
223 : /**
224 : * Kurs-ID, zu dem das Dokument gehört
225 : * @var int
226 : * @access private
227 : */
228 : var $courseID;
229 : /**
230 : * Array mit den Team-IDs, denen die das Dokument enthaltende Phase zugeordnet ist
231 : * @var array
232 : * @access private
233 : */
234 : var $teamIDs;
235 : /**
236 : * Gibt an, wann das Planspiel abgeschlossen sein sollte.
237 : * @var int
238 : * @access private
239 : */
240 : var $deadline;
241 : /**
242 : * Objekt welches das Budget samt Reviewer-Aufwand eines Dokumentes errechnet
243 : * @var PlanspielBudget
244 : * @access private
245 : */
246 : var $planspielBudget;
247 : /**
248 : * Enthält den Aufwand des reviewers
249 : * @var int
250 : * @access private
251 : */
252 : var $reviewerBudget;
253 : /**
254 : * Konstruktor
255 : * Liest die Daten des Dokuments aus, dessen ID übergeben wurde
256 : * oder erzeugt ein neues Dokumenten-Objekt mit der ID 0.
257 : *
258 : * @access public
259 : * @param int $ID ID des Dokuments oder 0 für neues Dokument
260 : * @param int $phaseID Bei neuen Dokumenten die ID der Phase, zu dem das Dokument gehört
261 : */
262 : function Document($ID, $phaseID = 0) {
263 0 : global $db, $settings;
264 0 : $dbp = $settings["dbPrefix"];
265 0 : if (strval(intval($ID)) == $ID && $ID > 0) {
266 0 : $this->ID = intval($ID);
267 0 : $result = $db->get_row("SELECT * FROM {$dbp}planspiel_document WHERE id='$ID'");
268 0 : if ($db->num_rows) {
269 0 : $this->phaseID = intval($result->phase_id);
270 0 : $this->planspielID = intval($db->get_var("SELECT planspiel_id FROM {$dbp}planspiel_phase WHERE id='$this->phaseID'"));
271 0 : $this->name = $result->name;
272 0 : $this->description = $result->description;
273 0 : $this->type = intval($result->type_of);
274 0 : $this->templateID = intval($result->template_id);
275 0 : $this->folderID = intval($result->save_to_folder);
276 0 : $this->fileID = intval($result->file_id);
277 0 : $this->editorUserID = intval($result->editor_id);
278 0 : $this->reviewerUserID = intval($result->reviewer_id);
279 0 : $this->inProgressSince = intval($result->in_progress);
280 0 : $this->inProgressComment = $result->progress_comment;
281 0 : $this->readyForApprovalSince = intval($result->ready_for_approval);
282 0 : $this->readyForApprovalComment = $result->approval_comment;
283 0 : $this->feedbackRequestSince = intval($result->feedback_requested);
284 0 : $this->feedbackRequestComment = $result->feedback_comment;
285 0 : $this->acceptedSince = intval($result->accepted);
286 0 : $this->acceptedComment = $result->accepted_comment;
287 0 : $this->reviseUntil = intval($result->revise_until);
288 0 : $this->reviseComment = $result->revise_comment;
289 0 : $this->reviseTS = intval($result->revise_ts);
290 0 : $this->changeRequestSince = intval($result->change_request);
291 0 : $this->changeRequestComment = $result->change_req_comment;
292 0 : $this->estimatedEffortTS = intval($result->estimated_effort_ts);
293 0 : $this->daysSpentTS = intval($result->days_spent_ts);
294 0 : $this->etcTS = intval($result->etc_ts);
295 0 : $this->deadline = $result->deadline;
296 0 : $this->estimatedEffort = $result->estimated_effort;
297 0 : $this->daysSpent = $result->days_spent;
298 0 : $this->etc = $result->etc;
299 :
300 : // Setze das Budget des Dokuments
301 0 : $this->planspielBudget = new PlanspielBudget($this->planspielID);
302 0 : $this->reviewerBudget = $this->planspielBudget->GetReviewerBudget($this->ID);
303 : // Addiere den Aufwand des Reviewers zum verbrauchten Budget
304 0 : $this->daysSpent = $this->daysSpent + $this->reviewerBudget;
305 :
306 0 : $this->courseID = intval($db->get_var("SELECT course_id FROM {$dbp}planspiel WHERE id='$this->planspielID'"));
307 0 : $teamIDs = $db->get_col("SELECT team_id FROM {$dbp}planspiel_phase_team WHERE phase_id='$this->phaseID' ORDER BY team_id");
308 0 : if ($db->num_rows) {
309 0 : $this->teamIDs = array_map("intval", $teamIDs);
310 0 : } else {
311 0 : $this->teamIDs = array();
312 : }
313 0 : } else {
314 0 : $this->setDefaultValues($phaseID);
315 : }
316 0 : } else {
317 0 : $this->setDefaultValues($phaseID);
318 : }
319 0 : }
320 : /**
321 : * Setzt die Standardwerte für ein neues Dokumenten-Objekt.
322 : *
323 : * @access private
324 : * @param int $phaseID ID der Phase bei neuem Dokument
325 : * @return void
326 : */
327 : function setDefaultValues($phaseID) {
328 0 : global $db, $settings;
329 0 : $dbp = $settings["dbPrefix"];
330 0 : $this->ID = 0;
331 0 : $this->phaseID = intval($phaseID);
332 0 : $this->planspielID = intval($db->get_var("SELECT planspiel_id FROM {$dbp}planspiel_phase WHERE id='$this->phaseID'"));
333 0 : $this->name = "";
334 0 : $this->description = "";
335 0 : $this->type = 0;
336 0 : $this->templateID = 0;
337 0 : $this->folderID = 0;
338 0 : $this->fileID = 0;
339 0 : $this->editorUserID = 0;
340 0 : $this->reviewerUserID = 0;
341 0 : $this->inProgressSince = 0;
342 0 : $this->inProgressComment = "";
343 0 : $this->readyForApprovalSince = 0;
344 0 : $this->readyForApprovalComment = "";
345 0 : $this->feedbackRequestSince = 0;
346 0 : $this->feedbackRequestComment = "";
347 0 : $this->acceptedSince = 0;
348 0 : $this->acceptedComment = "";
349 0 : $this->reviseUntil = 0;
350 0 : $this->reviseComment = "";
351 0 : $this->reviseTS = 0;
352 0 : $this->changeRequestSince = 0;
353 0 : $this->changeRequestComment = "";
354 0 : $this->estimatedEffort = 0;
355 0 : $this->estimatedEffortTS = 0;
356 0 : $this->daysSpent = 0;
357 0 : $this->daysSpentTS = 0;
358 0 : $this->etc = 0;
359 0 : $this->etcTS = 0;
360 0 : $this->courseID = $_SESSION["course"];
361 0 : $teamIDs = $db->get_col("SELECT team_id FROM {$dbp}planspiel_phase_team WHERE phase_id='$this->phaseID' ORDER BY team_id");
362 0 : if ($db->num_rows) {
363 0 : $this->teamIDs = array_map("intval", $teamIDs);
364 0 : } else {
365 0 : $this->teamIDs = array();
366 : }
367 0 : }
368 : /**
369 : * Zeigt das Formular zum Bearbeiten des Dokuments an.
370 : * Je nach Rolle des Betrachters sind einige Angaben nicht editierbar.
371 : *
372 : * @access public
373 : * @param boolean $isLeader Der Betrachter ist Spielleiter
374 : * @param boolean $isEditor Der Betrachter ist Bearbeiter oder Reviewer des Dokuments
375 : * @return void
376 : */
377 : function showEditForm($isLeader, $isEditor, $isReviewer, $isResponsible) {
378 0 : global $db, $settings;
379 0 : $dbp = $settings["dbPrefix"];
380 0 : $ID = $this->getID();
381 0 : $form = new Formular();
382 0 : $form->setTemplate("<table class='contentTable'>", "<tr valign='top'><td>", "<td>");
383 0 : $form->setButtons(1, "Speichern");
384 0 : $form->addRawCode("<tr><td colspan='2' class='tableHead'>".($this->ID > 0 ? "Dokument bearbeiten" : "Neues Dokument") ."</td></tr>");
385 0 : $form->addInput("hidden", "ID", "", 0, $this->ID);
386 0 : $form->addInput("hidden", "planspielID", "", 0, $this->planspielID);
387 0 : $form->addInput("hidden", "phaseID", "", 0, $this->phaseID);
388 0 : $width = "450px"; // Breite der Eingabefelder
389 0 : if ($isLeader || $isResponsible) {
390 0 : $form->addToNextTag("style='width:$width'");
391 0 : $form->addInput("text", "name", "Name", 60, $this->name, 100);
392 0 : $form->addToNextTag("style='width:$width'");
393 0 : $form->addTextArea("description", "Beschreibung<br />(".BBCode::getTagOverviewLink() .")", 60, 10, $this->description);
394 : // Dokumenttypen
395 0 : $types = $db->get_results("SELECT * FROM {$dbp}planspiel_doc_type ORDER BY name");
396 0 : $docTypes = array(array("Neuen Typ anlegen", 0));
397 0 : if ($db->num_rows) {
398 0 : foreach($types as $type) {
399 0 : $docTypes[] = array(Data::toHTML($type->name, false), intval($type->id));
400 0 : }
401 0 : }
402 0 : $form->addToNextTag("style='width:$width' id='type' onchange='if (this.value>0) document.getElementById(\"newtype\").disabled=true; else document.getElementById(\"newtype\").disabled=false;'");
403 0 : $form->addSelect("type", "Dokumenttyp", $docTypes, 1, false, ($this->type > 0 ? $this->type : ""));
404 0 : $form->addToNextTag("style='width:$width' id='newtype'".($this->type > 0 ? " onfocus='if (document.getElementById(\"type\").value>0) this.disabled=true;'" : ""));
405 0 : $form->addInput("text", "newtype", "Neuer Dokumenttyp<br /><span class='text10'>(Der neue Typ wird in allen anderen Planspielen auch zur Verfügung stehen.)</span>");
406 : // Vorlagen
407 0 : $templates = $db->get_results("SELECT fileID, {$dbp}filelist.name FROM {$dbp}filelist JOIN {$dbp}planspiel ON parent_object=template_folder WHERE id='$this->planspielID' AND type='file' ORDER BY {$dbp}filelist.name");
408 0 : $templateFiles = array(array("keine", 0));
409 0 : if ($db->num_rows) {
410 0 : foreach($templates as $template) {
411 0 : $templateFiles[] = array(Data::toHTML($template->name, false), intval($template->fileID));
412 0 : }
413 0 : }
414 0 : $form->addToNextTag("style='width:$width'");
415 0 : $form->addSelect("template", "Vorlage", $templateFiles, 1, false, ($this->templateID > 0 ? $this->templateID : ""));
416 : // Ablageordner
417 0 : $filem = new Insert();
418 0 : $folders = array();
419 0 : $count = $filem->printSubFolder(0, "", $folders, 0, "");
420 0 : $form->addSelect("folder", "Ablage-Ordner", $folders, ($count > 8 ? 8 : $count), false, ($this->folderID > 0 ? $this->folderID : ""));
421 : // Bearbeiter und Reviewer
422 0 : $user = array();
423 0 : if (!empty($this->teamIDs)) {
424 0 : $utm = new UserTeamManagement((int)$this->courseID);
425 0 : foreach($this->teamIDs as $teamID) {
426 0 : $team = new Team($teamID);
427 0 : foreach($utm->getUsersOfTeam($teamID) as $userID) {
428 0 : $user[] = array(Data::toHTML($team->getName() .": ".$utm->users[$userID], false), $userID);
429 0 : }
430 0 : }
431 0 : } else {
432 0 : $participants = Course::getParticipants($this->courseID, "all", "user.Nachname, user.Vorname");
433 0 : foreach($participants as $participant) {
434 0 : $user[] = array(Data::toHTML($participant->lastname.", ".$participant->firstname, false), $participant->userid);
435 0 : }
436 : }
437 :
438 0 : if($isResponsible){
439 0 : $form->addMarker();
440 0 : echo $form->getForm(0);
441 0 : echo "<tr valign='top'><td>Deadline</td><td>";
442 0 : if($this->deadline > 0){
443 0 : $date = getdate($this->deadline);
444 0 : }
445 : else{
446 0 : $date = getdate(time()+24*3600);
447 : }
448 0 : $ds = new DateSelection($date["mday"], $date["mon"], $date["year"], $date["hours"], $date["minutes"]);
449 0 : $ds->clearStrings();
450 0 : $ds->printCalender("deadline", "all");
451 0 : echo "</td></tr>";
452 0 : $form->addToNextTag("id='in_progress'");
453 0 : if($this->inProgressSince == '0'){
454 0 : $form->addInput("checkbox", "in_progress", "<label for='in_progress'><strong>Dieses Dokument zur<br>Bearbeitung freigeben</strong></label>".($this->inProgressSince ? "<br />(".Output::echoDate("d.m.Y H:i", $this->inProgressSince) .")" : ""), 60, ($this->inProgressSince ? "1" : ""), $this->inProgressSince);
455 0 : } else {
456 0 : $form->addRawCode("<tr><td>Bearbeitung</td><td>"."Dieses Dokument wurde am ".date("d.m.Y", $this->inProgressSince)." um ".date("H:i", $this->inProgressSince)." freigegeben."."</td></tr>");
457 : }
458 0 : $form->addToNextTag("style='width:$width'");
459 0 : $form->addTextArea("progress_comment", "Kommentar zur Bearbeitung<br />(".BBCode::getTagOverviewLink() .")", 60, 10, $this->inProgressComment);
460 0 : } else {
461 0 : $form->addRawCode("<tr><td>Deadline</td><td>".($this->deadline > 0 ? date("d.m.Y", $this->deadline) : "Noch keine Angabe vom Phasenverantwortlichen.") ."</td></tr>");
462 : }
463 0 : $form->addToNextTag("style='width:$width'");
464 0 : $form->addSelect("editor", "Bearbeiter", $user, 1, false, ($this->editorUserID > 0 ? $this->editorUserID : ""));
465 0 : $form->addToNextTag("style='width:$width'");
466 0 : $form->addSelect("reviewer", "Reviewer", $user, 1, false, ($this->reviewerUserID > 0 ? $this->reviewerUserID : ""));
467 0 : } else {
468 0 : $form->addRawCode("<tr><td>Name</td><td>".Data::toHTML($this->name, false) ."</td></tr>");
469 0 : $form->addRawCode("<tr valign='top'><td>Beschreibung</td><td>".$this->getDescription() ."</td></tr>");
470 0 : $form->addRawCode("<tr><td>Dokumenttyp</td><td>".Data::toHTML($this->getTypeName(), false) ."</td></tr>");
471 0 : if ($this->templateID > 0) $form->addRawCode("<tr><td>Vorlage</td><td><a href='".PATH_TO_ROOT."ressourcen/filemanager.php?action=getfile&actionID=$this->templateID'>".Data::toHTML($this->getTemplateName(), false) ."</a></td></tr>");
472 0 : $form->addRawCode("<tr><td>Bearbeiter</td><td>".$this->getEditor() ."</td></tr>");
473 0 : $form->addRawCode("<tr><td>Reviewer</td><td>".$this->getReviewer() ."</td></tr>");
474 : }
475 0 : if ($this->ID > 0) {
476 0 : if ($isEditor) {
477 0 : $form->addInput("file", "upload", "Upload".($this->fileID ? "<br /><span class='text10'>(Die bereits vorhandene Datei wird überschrieben.".($this->acceptedSince ? "<br />Der Akzeptiert-Status wird zurückgenommen." : "") .")</span>":
478 0 : ""));
479 0 : } else {
480 0 : $form->addRawCode("<tr><td>Download</td><td>".($this->fileID ? $this->getLinkToFile() : "Noch keine Datei vorhanden.") ."</td></tr>");
481 : }
482 0 : $form->addRawCode("<tr><td colspan='2' class='tableHead'>Aufwandsangaben + Deadline</td></tr>");
483 0 : if ($isResponsible && $this->estimatedEffortTS == 0) {
484 0 : $form->addInput("text", "effort", "Geschätzter Aufwand<br /><span class='text10'>(in <acronym title='Personentage'>PT</acronym>, kann nicht mehr geändert werden)</span>", 3, "", 4);
485 0 : } else {
486 0 : $form->addRawCode("<tr><td>Geschätzter Aufwand</td><td>".($this->estimatedEffortTS > 0 ? $this->estimatedEffort." <acronym title='Personentage'>PT</acronym> (".Output::echoDate("d.m.Y H:i", $this->estimatedEffortTS) .")" : "Noch keine Angabe vom Phasenverantwortlichen.") ."</td></tr>");
487 : }
488 0 : if ($isEditor || ($isReviewer && $this->readyForApprovalSince)) {
489 0 : $form->addInput("text", "spent", "Bisher aufgewendet <span class='text10'>(in <acronym title='Personentage'>PT</acronym>)</span>", 3, $this->daysSpent, 4);
490 0 : $form->addInput("text", "etc", "Geschätzter Aufwand bis zur Fertigstellung (<acronym title='Estimated Time to Complete'>ETC</acronym>) <span class='text10'>(in <acronym title='Personentage'>PT</acronym>)</span>", 3, $this->etc, 4);
491 0 : } else {
492 0 : $form->addRawCode("<tr><td>Bisher aufgewendet</td><td>".($this->daysSpentTS > 0 ? $this->daysSpent." <acronym title='Personentage'>PT</acronym> (".Output::echoDate("d.m.Y H:i", $this->daysSpentTS) .") davon (".$this->reviewerBudget." PT für Revieweraufwand)" : "Noch keine Angabe.") ."</td></tr>");
493 0 : $form->addRawCode("<tr><td><acronym title='Estimated Time to Complete'>ETC</acronym></td><td>".($this->etcTS > 0 ? $this->etc." <acronym title='Personentage'>PT</acronym> (".Output::echoDate("d.m.Y H:i", $this->etcTS) .")" : "Noch keine Angabe.") ."</td></tr>");
494 : }
495 0 : if ($isEditor){
496 0 : if($this->inProgressSince > '0'){
497 0 : $form->addToNextTag("id='in_progress'");
498 0 : $form->addRawCode("<tr><td>Bearbeitung</td><td>"."Dieses Dokument wurde am ".date("d.m.Y", $this->inProgressSince)." um ".date("H:i", $this->inProgressSince)." freigegeben."."</td></tr>");
499 0 : }
500 0 : $form->addRawCode("<tr><td>Deadline</td><td>".($this->deadline > 0 ? date("d.m.Y H:i", $this->deadline) : "Noch keine Angabe vom Phasenverantwortlichen.") ."</td></tr>");
501 0 : }
502 0 : if ($isEditor || $this->inProgressSince || $this->readyForApprovalSince || $this->feedbackRequestSince) {
503 0 : $form->addRawCode("<tr><td colspan='2' class='tableHead'>Bearbeiter-/Reviewer-Status</td></tr>");
504 0 : }
505 0 : if ($isEditor) {
506 0 : if ($this->estimatedEffort > 0 && $this->daysSpent > 0) {
507 0 : $form->addToNextTag("id='ready_for_approval'");
508 0 : $form->addInput("checkbox", "ready_for_approval", "<label for='ready_for_approval'><strong>Bereit zur Abnahme</strong></label>".($this->readyForApprovalSince ? "<br />(".Output::echoDate("d.m.Y H:i", $this->readyForApprovalSince) .")" : ""), 60, ($this->readyForApprovalSince ? "1" : ""), $this->readyForApprovalSince);
509 0 : $form->addToNextTag("style='width:$width'");
510 0 : $form->addTextArea("approval_comment", "Kommentar<br />(".BBCode::getTagOverviewLink() .")", 60, 10, $this->readyForApprovalComment);
511 0 : } else {
512 0 : $form->addRawCode("<tr valign='top'><td><strong>Bereit zur Abnahme</strong></td><td>Das Dokument kann noch nicht als abnahmebereit markiert werden, solange kein Bearbeitungsaufwand eingetragen wurde.</td></tr>");
513 : }
514 0 : $form->addToNextTag("id='feedback_req'");
515 0 : $form->addInput("checkbox", "feedback_req", "<label for='feedback_req'><strong>Feedback erbeten</strong></label>".($this->feedbackRequestSince ? "<br />(".Output::echoDate("d.m.Y H:i", $this->feedbackRequestSince) .")" : ""), 60, ($this->feedbackRequestSince ? "1" : ""), $this->feedbackRequestSince);
516 0 : $form->addToNextTag("style='width:$width'");
517 0 : $form->addTextArea("feedback_comment", "Kommentar<br />(".BBCode::getTagOverviewLink() .")", 60, 10, $this->feedbackRequestComment);
518 0 : } else {
519 0 : if ($this->inProgressSince) {
520 0 : $form->addRawCode("<tr valign='top'><td><strong>In Bearbeitung</strong><br />seit dem ".Output::echoDate("d.m.Y H:i", $this->inProgressSince) ."</td><td>".$this->getInProgressComment() ."</td></tr>");
521 0 : }
522 0 : if ($this->readyForApprovalSince) {
523 0 : $form->addRawCode("<tr valign='top'><td><strong>Bereit zur Abnahme</strong><br />seit dem ".Output::echoDate("d.m.Y H:i", $this->readyForApprovalSince) ."</td><td>".$this->getReadyForApprovalComment() ."</td></tr>");
524 0 : }
525 0 : if ($this->feedbackRequestSince) {
526 0 : $form->addRawCode("<tr valign='top'><td><strong>Feedback erbeten</strong><br />am ".Output::echoDate("d.m.Y H:i", $this->feedbackRequestSince) ."</td><td>".$this->getFeedbackRequestComment() ."</td></tr>");
527 0 : }
528 : }
529 0 : if ($isLeader || $isResponsible || $this->acceptedSince || $this->reviseUntil || $this->changeRequestSince || $isReviewer) {
530 0 : $form->addRawCode("<tr><td colspan='2' class='tableHead'>Abnahme-Status</td></tr>");
531 0 : }
532 0 : if ($this->fileID > 0 && ($isLeader || $isResponsible || ($isReviewer && $this->readyForApprovalSince))) {
533 0 : $form->addToNextTag("id='accepted'");
534 0 : $form->addInput("checkbox", "accepted", "<label for='accepted'><strong>Akzeptiert</strong></label>".($this->acceptedSince ? "<br />(".Output::echoDate("d.m.Y H:i", $this->acceptedSince) .")" : ""), 60, ($this->acceptedSince ? "1" : ""), $this->acceptedSince);
535 0 : $form->addToNextTag("style='width:$width'");
536 0 : $form->addTextArea("accepted_comment", "Kommentar<br />(".BBCode::getTagOverviewLink() .")", 60, 10, $this->acceptedComment);
537 0 : $form->addToNextTag("id='revise'");
538 0 : $form->addInput("checkbox", "revise", "<label for='revise'><strong>Überarbeitung erbeten</strong></label>".($this->reviseTS ? "<br />(".Output::echoDate("d.m.Y H:i", $this->reviseTS) .")" : ""), 60, ($this->reviseUntil ? "1" : ""), $this->reviseUntil);
539 0 : $form->addMarker();
540 0 : $form->addToNextTag("style='width:$width'");
541 0 : $form->addTextArea("revise_comment", "Kommentar<br />(".BBCode::getTagOverviewLink() .")", 60, 10, $this->reviseComment);
542 0 : $form->addToNextTag("id='change_req'");
543 0 : $form->addInput("checkbox", "change_req", "<label for='change_req'><strong>Change Request</strong></label>".($this->changeRequestSince ? "<br />(".Output::echoDate("d.m.Y H:i", $this->changeRequestSince) .")" : ""), 60, ($this->changeRequestSince ? "1" : ""), $this->changeRequestSince);
544 0 : $form->addToNextTag("style='width:$width'");
545 0 : $form->addTextArea("change_req_comment", "Kommentar<br />(".BBCode::getTagOverviewLink() .")", 60, 10, $this->changeRequestComment);
546 0 : } else if ($this->fileID > 0) {
547 0 : if ($isReviewer && !$this->readyForApprovalSince) {
548 0 : $form->addRawCode("<tr valign='top'><td colspan='2'>Das Dokument ist noch nicht zur Abnahme bereit.</td></tr>");
549 0 : }
550 0 : if ($this->acceptedSince) {
551 0 : $form->addRawCode("<tr valign='top'><td><strong>Akzeptiert</strong><br />am ".Output::echoDate("d.m.Y H:i", $this->acceptedSince) ."</td><td>".$this->getAcceptedComment() ."</td></tr>");
552 0 : }
553 0 : if ($this->reviseUntil) {
554 0 : $form->addRawCode("<tr valign='top'><td><strong>Überarbeitung</strong><br />bis zum ".Output::echoDate("d.m.Y", $this->reviseUntil) ."</td><td>".$this->getReviseComment() ."</td></tr>");
555 0 : }
556 0 : if ($this->changeRequestSince) {
557 0 : $form->addRawCode("<tr valign='top'><td><strong>Change Request</strong><br />am ".Output::echoDate("d.m.Y H:i", $this->changeRequestSince) ."</td><td>".$this->getChangeRequestComment() ."</td></tr>");
558 0 : }
559 0 : } else {
560 0 : $form->addRawCode("<tr valign='top'><td colspan='2'>Es wurde noch keine Datei für das Dokument hochgeladen.</td></tr>");
561 : }
562 0 : }
563 0 : if ($isLeader || $isResponsible || $isEditor || ($isReviewer && $this->readyForApprovalSince)) {
564 0 : $form->addButtons();
565 0 : }
566 0 : if ($this->fileID > 0 && $this->ID > 0 && ($isLeader || $isResponsible || ($isReviewer && $this->readyForApprovalSince))) {
567 : if($isResponsible)
568 0 : echo $form->getForm(1);
569 : else
570 0 : echo $form->getForm(0);
571 : // Datumauswahl für Überarbeitung anzeigen
572 0 : echo "<tr valign='top'><td>Bis zum</td><td>";
573 0 : if ($this->reviseUntil) {
574 0 : $date = getdate($this->reviseUntil);
575 0 : } else {
576 0 : $date = getdate();
577 : }
578 0 : $ds = new DateSelection($date["mday"], $date["mon"], $date["year"]);
579 0 : $ds->clearStrings();
580 0 : $ds->printCalender("revise_until", "dateExt");
581 0 : echo "</td></tr>";
582 : if($isResponsible)
583 0 : echo $form->getForm(2);
584 : else
585 0 : echo $form->getForm(1);
586 0 : } else {
587 0 : echo $form->getForm(1);
588 : }
589 0 : }
590 :
591 : /**
592 : * Zeigt die Details des Dokuments an.
593 : *
594 : * @access public
595 : * @return void
596 : */
597 : function showDetails() {
598 0 : global $db, $settings;
599 0 : $dbp = $settings["dbPrefix"];
600 0 : $ID = $this->getID();
601 0 : $form = new Formular();
602 0 : $form->setTemplate("<table class='contentTable'>", "<tr valign='top'><td>", "<td>");
603 0 : $form->setButtons(1, "Speichern");
604 0 : $form->addRawCode("<tr><td colspan='2' class='tableHead'>".($this->ID > 0 ? "Dokument bearbeiten" : "Neues Dokument") ."</td></tr>");
605 0 : $form->addInput("hidden", "ID", "", 0, $this->ID);
606 0 : $form->addInput("hidden", "planspielID", "", 0, $this->planspielID);
607 0 : $form->addInput("hidden", "phaseID", "", 0, $this->phaseID);
608 0 : $width = "450px"; // Breite der Eingabefelder
609 0 : $form->addRawCode("<tr><td>Name</td><td>".Data::toHTML($this->name, false) ."</td></tr>");
610 0 : $form->addRawCode("<tr valign='top'><td>Beschreibung</td><td>".$this->getDescription() ."</td></tr>");
611 0 : $form->addRawCode("<tr><td>Dokumenttyp</td><td>".Data::toHTML($this->getTypeName(), false) ."</td></tr>");
612 0 : if ($this->templateID > 0) $form->addRawCode("<tr><td>Vorlage</td><td><a href='".PATH_TO_ROOT."ressourcen/filemanager.php?action=getfile&actionID=$this->templateID'>".Data::toHTML($this->getTemplateName(), false) ."</a></td></tr>");
613 0 : $form->addRawCode("<tr><td>Bearbeiter</td><td>".$this->getEditor() ."</td></tr>");
614 0 : $form->addRawCode("<tr><td>Reviewer</td><td>".$this->getReviewer() ."</td></tr>");
615 0 : if ($this->ID > 0) {
616 0 : $form->addRawCode("<tr><td>Download</td><td>".($this->fileID ? $this->getLinkToFile() : "Noch keine Datei vorhanden.") ."</td></tr>");
617 0 : $form->addRawCode("<tr><td colspan='2' class='tableHead'>Aufwandsangaben + Deadline</td></tr>");
618 0 : $form->addRawCode("<tr><td>Geschätzter Aufwand</td><td>".($this->estimatedEffortTS > 0 ? $this->estimatedEffort." <acronym title='Personentage'>PT</acronym> (".Output::echoDate("d.m.Y H:i", $this->estimatedEffortTS) .")" : "Noch keine Angabe vom Phasenverantwortlichen.") ."</td></tr>");
619 0 : $form->addRawCode("<tr><td>Bisher aufgewendet</td><td>".($this->daysSpentTS > 0 ? $this->daysSpent." <acronym title='Personentage'>PT</acronym> (".Output::echoDate("d.m.Y H:i", $this->daysSpentTS) .")" : "Noch keine Angabe.") ."</td></tr>");
620 0 : $form->addRawCode("<tr><td><acronym title='Estimated Time to Complete'>ETC</acronym></td><td>".($this->etcTS > 0 ? $this->etc." <acronym title='Personentage'>PT</acronym> (".Output::echoDate("d.m.Y H:i", $this->etcTS) .")" : "Noch keine Angabe.") ."</td></tr>");
621 0 : $deadline = intval($db->get_var("SELECT deadline FROM {$dbp}planspiel_document WHERE ID='$ID'"));
622 0 : $form->addRawCode("<tr><td>Bearbeitung</td><td>"."Dieses Dokument wurde am ".date("d.m.Y", $this->inProgressSince)." um ".date("H:i", $this->inProgressSince)." freigegeben."."</td></tr>");
623 0 : $form->addRawCode("<tr><td>Deadline</td><td>".($deadline != "0" ? date("d.m.Y, H:i", $deadline)." Uhr" : "Noch keine Angabe vom Phasenverantwortlichen.") ."</td></tr>");
624 0 : if ($this->inProgressSince) {
625 0 : $form->addRawCode("<tr valign='top'><td><strong>In Bearbeitung</strong><br />seit dem ".Output::echoDate("d.m.Y H:i", $this->inProgressSince) ."</td><td>".$this->getInProgressComment() ."</td></tr>");
626 0 : }
627 0 : if ($this->readyForApprovalSince) {
628 0 : $form->addRawCode("<tr valign='top'><td><strong>Bereit zur Abnahme</strong><br />seit dem ".Output::echoDate("d.m.Y H:i", $this->readyForApprovalSince) ."</td><td>".$this->getReadyForApprovalComment() ."</td></tr>");
629 0 : }
630 0 : if ($this->feedbackRequestSince) {
631 0 : $form->addRawCode("<tr valign='top'><td><strong>Feedback erbeten</strong><br />am ".Output::echoDate("d.m.Y H:i", $this->feedbackRequestSince) ."</td><td>".$this->getFeedbackRequestComment() ."</td></tr>");
632 0 : }
633 0 : if ($this->fileID > 0) {
634 0 : if ($this->acceptedSince) {
635 0 : $form->addRawCode("<tr valign='top'><td><strong>Akzeptiert</strong><br />am ".Output::echoDate("d.m.Y H:i", $this->acceptedSince) ."</td><td>".$this->getAcceptedComment() ."</td></tr>");
636 0 : }
637 0 : if ($this->reviseUntil) {
638 0 : $form->addRawCode("<tr valign='top'><td><strong>Überarbeitung</strong><br />bis zum ".Output::echoDate("d.m.Y", $this->reviseUntil) ."</td><td>".$this->getReviseComment() ."</td></tr>");
639 0 : }
640 0 : if ($this->changeRequestSince) {
641 0 : $form->addRawCode("<tr valign='top'><td><strong>Change Request</strong><br />am ".Output::echoDate("d.m.Y H:i", $this->changeRequestSince) ."</td><td>".$this->getChangeRequestComment() ."</td></tr>");
642 0 : }
643 0 : }
644 : else {
645 0 : $form->addRawCode("<tr valign='top'><td colspan='2'>Es wurde noch keine Datei für das Dokument hochgeladen.</td></tr>");
646 : }
647 0 : }
648 0 : echo $form->getForm();
649 0 : }
650 :
651 : /**
652 : * Versucht, die im übergebenen Array vorhandenen Daten anhand der
653 : * assoziativen Array-Indizes als neue Dokument-Daten abzuspeichern. Dabei
654 : * kann es sich zum Beispiel um das $_POST-Array handeln. Es werden dabei
655 : * entweder alle oder keine Daten gespeichert. Sind einige der Daten
656 : * fehlerhaft, wird ein String mit Fehlermeldungen zurückgeliefert, sonst
657 : * der boolsche Wert true.
658 : *
659 : * @access public
660 : * @param array $data Assoziatives Array mit den neuen Werten
661 : * @param boolean $isLeader Der Betrachter ist Spielleiter
662 : * @param boolean $isEditor Der Betrachter ist Bearbeiter oder Reviewer des Dokuments
663 : * @return mixed String mit Fehlermeldungen oder true bei Erfolg
664 : */
665 : function setData($data, $isLeader, $isEditor, $isReviewer) {
666 0 : $errors = "";
667 0 : if ($isLeader) {
668 0 : if (($result = $this->validateName($data["name"])) !== true) {
669 0 : $errors.= $result."\n";
670 0 : }
671 0 : if (($result = $this->validateDocumentType($data["type"], isset($data["newtype"]) ? $data["newtype"] : "")) !== true) {
672 0 : $errors.= $result."\n";
673 0 : }
674 0 : if (($result = $this->validateTemplateID($data["template"])) !== true) {
675 0 : $errors.= $result."\n";
676 0 : }
677 0 : if (($result = $this->validateFolderID(isset($data["folder"]) ? $data["folder"] : "")) !== true) {
678 0 : $errors.= $result."\n";
679 0 : }
680 0 : if (($result = $this->validateEditorUserID($data["editor"])) !== true) {
681 0 : $errors.= $result."\n";
682 0 : }
683 0 : if (($result = $this->validateReviewerUserID($data["reviewer"])) !== true) {
684 0 : $errors.= $result."\n";
685 0 : }
686 0 : if (($result = $this->validateReviewer($data["reviewer"], $data["editor"])) !== true) {
687 0 : $errors.= $result."\n";
688 0 : }
689 0 : if (isset($data["deadline_hour"]) && ($result = $this->validateDeadline(mktime($data["deadline_hour"], $data["deadline_minute"], 0, $data["deadline_month"], $data["deadline_day"], $data["deadline_year"]))) !== true) {
690 0 : $errors.= $result."\n";
691 0 : }
692 0 : }
693 0 : if (($isLeader || $isReviewer) && $this->ID > 0 && isset($data["revise"])) {
694 0 : if (($result = $this->validateReviseUntilDate(mktime(23, 59, 59, $data["revise_until_month"], $data["revise_until_day"], $data["revise_until_year"]))) !== true) {
695 0 : $errors.= $result."\n";
696 0 : }
697 0 : }
698 0 : if ($this->ID > 0 && $isLeader) {
699 0 : if ($this->estimatedEffortTS == 0) {
700 0 : if (($result = $this->validateEstimatedEffort($data["effort"])) !== true) {
701 0 : $errors.= $result."\n";
702 0 : }
703 0 : }
704 0 : }
705 0 : if ($this->ID > 0 && ($isEditor || $isReviewer)) {
706 0 : if (($result = $this->validateDaysSpent($data["spent"])) !== true) {
707 0 : $errors.= $result."\n";
708 0 : }
709 0 : if (($result = $this->validateETC($data["etc"])) !== true) {
710 0 : $errors.= $result."\n";
711 0 : }
712 0 : }
713 0 : if (empty($errors)) {
714 0 : if ($isLeader) {
715 0 : if (!$this->setName($data["name"])) {
716 0 : return "Name konnte nicht gespeichert werden.";
717 : }
718 0 : if (!$this->setDescription($data["description"])) {
719 0 : return "Beschreibung konnte nicht gespeichert werden.";
720 : }
721 0 : if (!$this->setDocumentType($data["type"], isset($data["newtype"]) ? $data["newtype"] : "")) {
722 0 : return "Dokumenttyp konnte nicht gespeichert werden.";
723 : }
724 0 : if (!$this->setTemplateID($data["template"])) {
725 0 : return "Vorlage konnte nicht gespeichert werden.";
726 : }
727 0 : if (!$this->setFolderID($data["folder"])) {
728 0 : return "Ablage-Ordner konnte nicht gespeichert werden.";
729 : }
730 0 : if (!$this->setEditorUserID($data["editor"])) {
731 0 : return "Bearbeiter konnte nicht gespeichert werden.";
732 : }
733 0 : if (!$this->setReviewerUserID($data["reviewer"])) {
734 0 : return "Reviewer konnte nicht gespeichert werden.";
735 : }
736 0 : if (isset($data["effort"]) && !$this->setEstimatedEffort($data["effort"])) {
737 0 : return "Geschätzter Aufwand konnte nicht gespeichert werden.";
738 : }
739 0 : if (isset($data["deadline_hour"]) && !$this->setDeadline(mktime($data["deadline_hour"], $data["deadline_minute"], 0, $data["deadline_month"], $data["deadline_day"], $data["deadline_year"]))) {
740 0 : return "Deadline konnte nicht gespeichert werden.";
741 : }
742 0 : if (isset($data["in_progress"]) && !$this->setInProgress((isset($data["in_progress"]) ? time() : 0), $data["progress_comment"])) {
743 0 : return "Bearbeitungs-Status konnte nicht gespeichert werden.";
744 : }
745 0 : }
746 0 : if (($isLeader || $isReviewer) && $this->ID > 0) {
747 0 : if (!$this->setAccepted((isset($data["accepted"]) ? time() : 0), isset($data["accepted_comment"]) ? $data["accepted_comment"] : "")) {
748 0 : return "Akzeptiert-Status konnte nicht gespeichert werden.";
749 : }
750 0 : if (!$this->setReviseUntil((isset($data["revise"]) ? time() : 0), (isset($data["revise"]) ? mktime(23, 59, 59, $data["revise_until_month"], $data["revise_until_day"], $data["revise_until_year"]) : 0), isset($data["revise_comment"]) ? $data["revise_comment"] : "")) {
751 0 : return "Überarbeitungs-Status konnte nicht gespeichert werden.";
752 : }
753 0 : if (!$this->setChangeRequest((isset($data["change_req"]) ? time() : 0), isset($data["change_req_comment"]) ? $data["change_req_comment"] : "")) {
754 0 : return "Change Request konnte nicht gespeichert werden.";
755 : }
756 0 : }
757 0 : if ($this->ID > 0 && $isEditor) {
758 0 : if (!$this->setReadyForApproval((isset($data["ready_for_approval"]) ? time() : 0), (isset($data["approval_comment"]) ? $data["approval_comment"] : ""))) {
759 0 : return "Bereitschaft zur Abnahme konnte nicht gespeichert werden.";
760 : }
761 0 : if (!$this->setFeedbackRequest((isset($data["feedback_req"]) ? time() : 0), $data["feedback_comment"])) {
762 0 : return "Feedback-Anfrage konnte nicht gespeichert werden.";
763 : }
764 0 : if ($_FILES["upload"]["error"] == UPLOAD_ERR_OK) {
765 0 : $this->setFile();
766 0 : }
767 0 : }
768 0 : if ($this->ID > 0 && ($isEditor || $isReviewer)) {
769 0 : if (isset($data["spent"]) && !$this->setDaysSpent($data["spent"])) {
770 0 : return "Bisheriger Aufwand konnte nicht gespeichert werden.";
771 : }
772 0 : if (isset($data["etc"]) && !$this->setETC($data["etc"])) {
773 0 : return "ETC konnte nicht gespeichert werden.";
774 : }
775 0 : }
776 0 : return true;
777 : }
778 0 : return trim($errors);
779 : }
780 : /**
781 : * Erstellt den grundlegenden Datenbankeintrag für das Dokument. Gesetzt wird
782 : * nur die Phasen-ID, die anderen Felder werden mit ihren Standardwerten belegt.
783 : *
784 : * @access private
785 : * @return boolean Erfolgswert
786 : */
787 : function createDocument() {
788 0 : global $db, $settings;
789 0 : $dbp = $settings["dbPrefix"];
790 0 : $db->query("INSERT INTO {$dbp}planspiel_document (phase_id) VALUES ('$this->phaseID')");
791 0 : if ($db->rows_affected) {
792 0 : $this->ID = $db->insert_id;
793 0 : return true;
794 : }
795 0 : return false;
796 : }
797 : /**
798 : * Löscht dieses Dokument.
799 : *
800 : * @access public
801 : * @return boolean Erfolgswert
802 : */
803 : function deleteDocument() {
804 0 : global $db, $settings, $EZSQL_ERROR;
805 0 : $dbp = $settings["dbPrefix"];
806 0 : $errorCount = count($EZSQL_ERROR);
807 0 : $db->query("DELETE FROM {$dbp}planspiel_document WHERE id='$this->ID'");
808 0 : if (count($EZSQL_ERROR) > $errorCount) {
809 0 : return false;
810 : }
811 0 : $this->setDefaultValues($this->phaseID);
812 0 : return true;
813 : }
814 : /**
815 : * Überprüft den übergebenen Namen auf Gültigkeit.
816 : *
817 : * @access public
818 : * @param string $name Der zu überprüfende String
819 : * @return mixed String mit Fehlerangabe oder true bei Erfolg
820 : */
821 : function validateName($name) {
822 0 : global $db, $settings;
823 0 : $dbp = $settings["dbPrefix"];
824 0 : $name = trim(Data::gpcUnescape($name));
825 0 : if (empty($name)) {
826 0 : return "Der Name wurde nicht angegeben.";
827 : }
828 0 : if (strlen($name) > 100) {
829 0 : return "Der Name ist zu lang.";
830 : }
831 0 : if ($this->ID == 0 && $db->get_var("SELECT COUNT(*) FROM {$dbp}planspiel_document WHERE phase_id='$this->phaseID' AND name='".Data::toMysql($name, false) ."'")) {
832 0 : return "Der Name ist in dieser Phase bereits vergeben.";
833 : }
834 0 : return true;
835 : }
836 :
837 : function validateDeadline($deadline) {
838 :
839 0 : if ($this->deadline == $deadline) {
840 0 : return true;
841 : }
842 :
843 0 : $date = getdate(time());
844 0 : $tomorrow = mktime(23, 59, 59, $date["mon"], $date["mday"], $date["year"]);
845 0 : if ($deadline < $tomorrow) {
846 0 : return "Die Deadline muss mindestens einen Tag in der Zukunft liegen.";
847 : }
848 0 : return true;
849 : }
850 :
851 :
852 : /**
853 : * Überprüft die Angabe des Dokumenttyps auf Gültigkeit.
854 : * Ist die Typ-ID = 0, wird ein neuer Typ angelegt.
855 : *
856 : * @access public
857 : * @param int $typeID ID des Dokumenttyps, 0 für neu anzulegenden Typ
858 : * @param string $newTypeName Name für den neuen Dokumenttyp
859 : * @return mixed String mit Fehlerangabe oder true bei Erfolg
860 : */
861 : function validateDocumentType($typeID, $newTypeName = "") {
862 0 : global $db, $settings;
863 0 : $dbp = $settings["dbPrefix"];
864 0 : $name = trim($newTypeName);
865 0 : if ($typeID == 0) {
866 0 : if (empty($name)) {
867 0 : return "Es wurde kein neuer Dokumenttyp angegeben.";
868 : }
869 0 : if (strlen($name) > 100) {
870 0 : return "Der neue Dokumenttyp-Name ist zu lang.";
871 : }
872 0 : if (!preg_match("/^[a-z0-9\-\. äöüßÄÖÜ]+$/i", $name)) {
873 0 : return "Der neue Dokumenttyp-Name enthält ungültige Zeichen.";
874 : }
875 0 : } else {
876 0 : $IDs = $db->get_col("SELECT id FROM {$dbp}planspiel_doc_type");
877 0 : if (!in_array($typeID, $IDs) && empty($name)) {
878 0 : return "Ungültige Dokumenttyp-ID.";
879 : }
880 : }
881 0 : return true;
882 : }
883 : /**
884 : * Überprüft die übergebene Vorlagen-ID auf Gültigkeit.
885 : *
886 : * @access public
887 : * @param int $fileID Die zu überprüfende ID
888 : * @return mixed String mit Fehlerangabe oder true bei Erfolg
889 : */
890 : function validateTemplateID($fileID) {
891 0 : global $db, $settings;
892 0 : $dbp = $settings["dbPrefix"];
893 0 : if ($fileID == 0) {
894 0 : return true;
895 : }
896 0 : $templates = $db->get_col("SELECT fileID FROM {$dbp}filelist JOIN {$dbp}planspiel ON parent_object=template_folder WHERE id='$this->planspielID' AND type='file'");
897 0 : if (!in_array($fileID, $templates)) {
898 0 : return "Datei-ID der Vorlage ungültig.";
899 : }
900 0 : return true;
901 : }
902 : /**
903 : * Überprüft die übergebene Verzeichnis-ID auf Gültigkeit.
904 : *
905 : * @access public
906 : * @param int $folderID Die zu überprüfende ID
907 : * @return mixed String mit Fehlerangabe oder true bei Erfolg
908 : */
909 : function validateFolderID($folderID) {
910 0 : if (empty($folderID)) {
911 0 : return "Es wurde kein Ablage-Ordner angegeben.";
912 : }
913 0 : $filem = new Insert();
914 0 : $folders = array();
915 0 : $count = $filem->printSubFolder(0, "", $folders, 0, "");
916 0 : foreach($folders as $folder) {
917 0 : if ($folder[1] == $folderID) {
918 0 : return true;
919 : }
920 0 : }
921 0 : return "Der Ablage-Ordner ist ungültig.";
922 : }
923 : /**
924 : * Überprüft die übergebene User-ID auf Gültigkeit.
925 : *
926 : * @access private
927 : * @param int $userID Die zu überprüfende ID
928 : * @return mixed String mit Fehlerangabe oder true bei Erfolg
929 : */
930 : function validateUserID($userID) {
931 0 : global $db, $settings;
932 0 : $dbp = $settings["dbPrefix"];
933 0 : $users = $db->get_col("SELECT userID FROM {$dbp}user_course WHERE courseID='$this->courseID'");
934 0 : return in_array($userID, $users);
935 : }
936 : /**
937 : * Überprüft die übergebene User-ID auf Gültigkeit.
938 : *
939 : * @access public
940 : * @param int $userID Die zu überprüfende ID
941 : * @return mixed String mit Fehlerangabe oder true bei Erfolg
942 : */
943 : function validateEditorUserID($userID) {
944 0 : if (!$this->validateUserID($userID)) {
945 0 : return "Die User-ID des Bearbeiters ist ungültig.";
946 : }
947 0 : return true;
948 : }
949 : /**
950 : * Überprüft die übergebene User-ID auf Gültigkeit.
951 : *
952 : * @access public
953 : * @param int $userID Die zu überprüfende ID
954 : * @return mixed String mit Fehlerangabe oder true bei Erfolg
955 : */
956 : function validateReviewerUserID($userID) {
957 0 : if (!$this->validateUserID($userID)) {
958 0 : return "Die User-ID des Reviewers ist ungültig.";
959 : }
960 0 : return true;
961 : }
962 : /* Überprüft die übergebene User-ID auf Gültigkeit.
963 : *
964 : * @access public
965 : * @param int $userID Die zu überprüfende ID
966 : * @return mixed String mit Fehlerangabe oder true bei Erfolg
967 : */
968 : function validateReviewer($reviewerID, $editorID) {
969 0 : if ($reviewerID == $editorID) {
970 0 : return "Der Bearbeiter kann nicht gleichzeitig Reviewer sein.";
971 : }
972 0 : return true;
973 : }
974 : /**
975 : * Überprüft den übergebenen Timestamp auf Gültigkeit.
976 : *
977 : * @access public
978 : * @param int $ts Der zu überprüfende Timestamp
979 : * @return mixed String mit Fehlerangabe oder true bei Erfolg
980 : */
981 : function validateReviseUntilDate($ts) {
982 0 : $date = getdate(time() +24*3600);
983 0 : $tomorrow = mktime(23, 59, 59, $date["mon"], $date["mday"], $date["year"]);
984 0 : if ($ts < $tomorrow) {
985 0 : return "Das Überarbeitungs-Datum muss mindestens einen Tag in der Zukunft liegen.";
986 : }
987 0 : return true;
988 : }
989 : /**
990 : * Überprüft die übergebenen Personentage auf Gültigkeit.
991 : *
992 : * @access public
993 : * @param float $days Die zu überprüfende Tagesanzahl
994 : * @return mixed String mit Fehlerangabe oder true bei Erfolg
995 : */
996 : function validateEstimatedEffort(&$days) {
997 0 : if (strpos($days, ",")) {
998 0 : $days = str_replace(",", ".", $days);
999 0 : }
1000 0 : if (is_numeric($days) && $days >= 0 && $days < 100) {
1001 0 : return true;
1002 : }
1003 0 : return "Die Angabe des geschätzten Aufwandes ist ungültig.";
1004 : }
1005 : /**
1006 : * Überprüft die übergebenen Personentage auf Gültigkeit.
1007 : *
1008 : * @access public
1009 : * @param float $days Die zu überprüfende Tagesanzahl
1010 : * @return mixed String mit Fehlerangabe oder true bei Erfolg
1011 : */
1012 : function validateDaysSpent(&$days) {
1013 0 : if (strpos($days, ",")) {
1014 0 : $days = str_replace(",", ".", $days);
1015 0 : }
1016 0 : if (is_numeric($days) && $days >= 0 && $days < 100) {
1017 0 : return true;
1018 : }
1019 0 : return "Die Angabe des bisherigen Aufwandes ist ungültig.";
1020 : }
1021 : /**
1022 : * Überprüft die übergebenen Personentage auf Gültigkeit.
1023 : *
1024 : * @access public
1025 : * @param float $days Die zu überprüfende Tagesanzahl
1026 : * @return mixed String mit Fehlerangabe oder true bei Erfolg
1027 : */
1028 : function validateETC(&$days) {
1029 0 : if (strpos($days, ",")) {
1030 0 : $days = str_replace(",", ".", $days);
1031 0 : }
1032 0 : if (is_numeric($days) && $days >= 0 && $days < 100) {
1033 0 : return true;
1034 : }
1035 0 : return "Die Angabe des ETC ist ungültig.";
1036 : }
1037 : /**
1038 : * Speichert den übergebenen String als neuen Namen dieses Dokuments.
1039 : * Der String sollte vorher mit der Methode validateName() validiert worden
1040 : * sein!
1041 : *
1042 : * @access public
1043 : * @param string $name Zu speichernder Name
1044 : * @return boolean Erfolgswert
1045 : */
1046 : function setName($name) {
1047 0 : global $db, $settings;
1048 0 : $dbp = $settings["dbPrefix"];
1049 0 : $name = trim($name);
1050 0 : if ($this->name == Data::gpcUnescape($name)) {
1051 0 : return true;
1052 : }
1053 0 : if ($this->ID == 0) {
1054 0 : if (!$this->createDocument()) {
1055 0 : return false;
1056 : }
1057 0 : }
1058 0 : $db->query("UPDATE {$dbp}planspiel_document SET name='".Data::toMysql($name) ."' WHERE id='$this->ID'");
1059 0 : if ($db->rows_affected) {
1060 0 : $this->name = Data::gpcUnescape($name);
1061 0 : return true;
1062 : }
1063 0 : return false;
1064 : }
1065 :
1066 : function setDeadline($deadline) {
1067 0 : global $db, $settings;
1068 0 : $dbp = $settings["dbPrefix"];
1069 :
1070 0 : if ($this->deadline == $deadline) {
1071 0 : return true;
1072 : }
1073 0 : $db->query("UPDATE {$dbp}planspiel_document SET deadline='$deadline' WHERE id='$this->ID'");
1074 0 : if ($db->rows_affected) {
1075 0 : $this->deadline = $deadline;
1076 0 : return true;
1077 : }
1078 0 : return false;
1079 : }
1080 :
1081 :
1082 :
1083 : /**
1084 : * Speichert den übergebenen String als neue Beschreibung dieses Dokuments.
1085 : *
1086 : * @access public
1087 : * @param string $desc Zu speichernde Beschreibung
1088 : * @return boolean Erfolgswert
1089 : */
1090 : function setDescription($desc) {
1091 0 : global $db, $settings;
1092 0 : $dbp = $settings["dbPrefix"];
1093 0 : $desc = trim($desc);
1094 0 : if ($this->description == Data::gpcUnescape($desc)) {
1095 0 : return true;
1096 : }
1097 0 : if ($this->ID == 0) {
1098 0 : if (!$this->createDocument()) {
1099 0 : return false;
1100 : }
1101 0 : }
1102 0 : if (empty($desc)) {
1103 0 : $descSQL = "NULL";
1104 0 : } else {
1105 0 : $descSQL = "'".Data::toMysql($desc) ."'";
1106 : }
1107 0 : $db->query("UPDATE {$dbp}planspiel_document SET description=$descSQL WHERE id='$this->ID'");
1108 0 : if ($db->rows_affected) {
1109 0 : $this->description = Data::gpcUnescape($desc);
1110 0 : return true;
1111 : }
1112 0 : return false;
1113 : }
1114 : /**
1115 : * Speichert die übergebene ID (> 0) als neuen Typ dieses Dokuments oder legt einen
1116 : * neuen Dokumenttyp an (ID = 0).
1117 : * Der Typ sollte vorher mit der Methode validateDocumentType() validiert worden sein!
1118 : *
1119 : * @access public
1120 : * @param int $typeID ID des Dokumenttyps, 0 für neu anzulegenden Typ
1121 : * @param string $newTypeName Name für den neuen Dokumenttyp
1122 : * @return boolean Erfolgswert
1123 : */
1124 : function setDocumentType($typeID, $newTypeName = "") {
1125 0 : global $db, $settings;
1126 0 : $dbp = $settings["dbPrefix"];
1127 0 : $newTypeName = trim($newTypeName);
1128 0 : $typeID = trim($typeID);
1129 0 : if ($typeID > 0 && $this->type == Data::gpcUnescape($typeID)) {
1130 0 : return true;
1131 : }
1132 0 : if ($typeID == 0 && empty($newTypeName)) {
1133 0 : return false;
1134 : }
1135 0 : if ($this->ID == 0) {
1136 0 : if (!$this->createDocument()) {
1137 0 : return false;
1138 : }
1139 0 : }
1140 0 : if ($typeID == 0) {
1141 0 : $tID = $db->get_var("SELECT id FROM {$dbp}planspiel_doc_type WHERE name='".Data::toMysql($newTypeName) ."'");
1142 0 : if ($db->num_rows) {
1143 0 : $typeID = $tID;
1144 0 : } else {
1145 0 : $db->query("INSERT INTO {$dbp}planspiel_doc_type (name) VALUES ('".Data::toMysql($newTypeName) ."')");
1146 0 : if (!$db->rows_affected) {
1147 0 : return false;
1148 : }
1149 0 : $typeID = $db->insert_id;
1150 : }
1151 0 : }
1152 0 : $db->query("UPDATE {$dbp}planspiel_document SET type_of='".Data::toMysql($typeID) ."' WHERE id='$this->ID'");
1153 0 : if ($db->rows_affected) {
1154 0 : $this->type = intval($typeID);
1155 0 : return true;
1156 : }
1157 0 : return false;
1158 : }
1159 : /**
1160 : * Speichert die übergebene ID als neue Vorlage für dieses Dokument.
1161 : * Die ID sollte vorher mit der Methode validateTemplateID() validiert worden sein!
1162 : *
1163 : * @access public
1164 : * @param int $ID ID der Vorlage
1165 : * @return boolean Erfolgswert
1166 : */
1167 : function setTemplateID($ID) {
1168 0 : global $db, $settings;
1169 0 : $dbp = $settings["dbPrefix"];
1170 0 : $ID = trim($ID);
1171 0 : if ($this->templateID == Data::gpcUnescape($ID)) {
1172 0 : return true;
1173 : }
1174 0 : if ($this->ID == 0) {
1175 0 : if (!$this->createDocument()) {
1176 0 : return false;
1177 : }
1178 0 : }
1179 0 : $db->query("UPDATE {$dbp}planspiel_document SET template_id='".Data::toMysql($ID) ."' WHERE id='$this->ID'");
1180 0 : if ($db->rows_affected) {
1181 0 : $this->templateID = intval($ID);
1182 0 : return true;
1183 : }
1184 0 : return false;
1185 : }
1186 : /**
1187 : * Speichert die übergebene ID als neuen Ablage-Ordner für dieses Dokument.
1188 : * Die ID sollte vorher mit der Methode validateFolderID() validiert worden sein!
1189 : *
1190 : * @access public
1191 : * @param int $ID ID des Verzeichnisses
1192 : * @return boolean Erfolgswert
1193 : */
1194 : function setFolderID($ID) {
1195 0 : global $db, $settings;
1196 0 : $dbp = $settings["dbPrefix"];
1197 0 : $ID = trim($ID);
1198 0 : if ($this->folderID == Data::gpcUnescape($ID)) {
1199 0 : return true;
1200 : }
1201 0 : if ($this->ID == 0) {
1202 0 : if (!$this->createDocument()) {
1203 0 : return false;
1204 : }
1205 0 : }
1206 0 : $db->query("UPDATE {$dbp}planspiel_document SET save_to_folder='".Data::toMysql($ID) ."' WHERE id='$this->ID'");
1207 0 : if ($db->rows_affected) {
1208 0 : $this->folderID = intval($ID);
1209 0 : return true;
1210 : }
1211 0 : return false;
1212 : }
1213 : /**
1214 : * Speichert die übergebene User-ID als neuen Bearbeiter für dieses Dokument.
1215 : * Die ID sollte vorher mit der Methode validateEditorUserID() validiert worden sein!
1216 : *
1217 : * @access public
1218 : * @param int $ID User-ID des Bearbeiters
1219 : * @return boolean Erfolgswert
1220 : */
1221 : function setEditorUserID($ID) {
1222 0 : global $db, $settings;
1223 0 : $dbp = $settings["dbPrefix"];
1224 0 : $ID = trim($ID);
1225 0 : if ($this->editorUserID == Data::gpcUnescape($ID)) {
1226 0 : return true;
1227 : }
1228 0 : if ($this->ID == 0) {
1229 0 : if (!$this->createDocument()) {
1230 0 : return false;
1231 : }
1232 0 : }
1233 0 : $db->query("UPDATE {$dbp}planspiel_document SET editor_id='".Data::toMysql($ID) ."' WHERE id='$this->ID'");
1234 0 : if ($db->rows_affected) {
1235 0 : $newUserID = intval(Data::gpcUnescape($ID));
1236 0 : $roles = PlanspielList::getPlanspielRoleIDs($this->courseID);
1237 0 : $urm = new UserRoleManagement($this->courseID);
1238 0 : if (count(PlanspielList::getPlanspielWhereEditor($this->courseID, $this->editorUserID)) == 0) {
1239 0 : $urm->unsetRoleForUser($this->editorUserID, $roles["editor"]);
1240 0 : }
1241 0 : $urm->setRoleForUser($newUserID, $roles["editor"]);
1242 0 : $this->editorUserID = $newUserID;
1243 0 : return true;
1244 : }
1245 0 : return false;
1246 : }
1247 : /**
1248 : * Speichert die übergebene User-ID als neuen Reviewer für dieses Dokument.
1249 : * Die ID sollte vorher mit der Methode validateReviewerUserID() validiert worden sein!
1250 : *
1251 : * @access public
1252 : * @param int $ID User-ID des Reviewers
1253 : * @return boolean Erfolgswert
1254 : */
1255 : function setReviewerUserID($ID) {
1256 0 : global $db, $settings;
1257 0 : $dbp = $settings["dbPrefix"];
1258 0 : $ID = trim($ID);
1259 0 : if ($this->reviewerUserID == Data::gpcUnescape($ID)) {
1260 0 : return true;
1261 : }
1262 0 : if ($this->ID == 0) {
1263 0 : if (!$this->createDocument()) {
1264 0 : return false;
1265 : }
1266 0 : }
1267 0 : $db->query("UPDATE {$dbp}planspiel_document SET reviewer_id='".Data::toMysql($ID) ."' WHERE id='$this->ID'");
1268 0 : if ($db->rows_affected) {
1269 0 : $newUserID = intval(Data::gpcUnescape($ID));
1270 0 : $roles = PlanspielList::getPlanspielRoleIDs($this->courseID);
1271 0 : $urm = new UserRoleManagement($this->courseID);
1272 0 : if (count(PlanspielList::getPlanspielWhereReviewer($this->courseID, $this->reviewerUserID)) == 0) {
1273 0 : $urm->unsetRoleForUser($this->reviewerUserID, $roles["reviewer"]);
1274 0 : }
1275 0 : $urm->setRoleForUser($newUserID, $roles["reviewer"]);
1276 0 : $this->reviewerUserID = $newUserID;
1277 0 : return true;
1278 : }
1279 0 : return false;
1280 : }
1281 : /**
1282 : * Speichert den übergebenen Timestamp und den Kommentar als neuen "Akzeptiert"-Status
1283 : * für dieses Dokument.
1284 : * Der Timestamp wird nur geändert, wenn sich der Kommentar auch geändert hat oder der Status
1285 : * gesetzt oder aufgehoben wurde.
1286 : *
1287 : * @access public
1288 : * @param int $ts Timestamp
1289 : * @param string $comment Kommentar
1290 : * @return boolean Erfolgswert
1291 : */
1292 : function setAccepted($ts, $comment) {
1293 0 : global $db, $settings;
1294 0 : $dbp = $settings["dbPrefix"];
1295 0 : $comment = trim($comment);
1296 0 : if (!(($this->acceptedSince == 0 && $ts > 0) || ($this->acceptedSince > 0 && $ts == 0)) && $this->acceptedComment == Data::gpcUnescape($comment)) {
1297 0 : $ts = $this->acceptedSince; // Timestamp nicht ändern, wenn der Kommentar nicht geändert wird
1298 :
1299 0 : }
1300 0 : if ($this->acceptedSince == $ts && $this->acceptedComment == Data::gpcUnescape($comment)) {
1301 0 : return true;
1302 : }
1303 0 : if ($this->ID == 0) {
1304 0 : if (!$this->createDocument()) {
1305 0 : return false;
1306 : }
1307 0 : }
1308 0 : if (empty($comment)) {
1309 0 : $commentSQL = "NULL";
1310 0 : } else {
1311 0 : $commentSQL = "'".Data::toMysql($comment) ."'";
1312 : }
1313 0 : $db->query("UPDATE {$dbp}planspiel_document SET accepted='$ts', accepted_comment=$commentSQL WHERE id='$this->ID'");
1314 0 : if ($db->rows_affected) {
1315 0 : $this->acceptedSince = intval($ts);
1316 0 : $this->acceptedComment = Data::gpcUnescape($comment);
1317 0 : $phase = new Phase($this->phaseID);
1318 0 : $phase->setFinished($phase->getFinishedDocumentsCount() == $phase->getDocumentsCount());
1319 0 : return true;
1320 : }
1321 0 : return false;
1322 : }
1323 : /**
1324 : * Speichert den übergebenen Timestamp und den Kommentar als neuen "Überarbeitung erbeten"-Status
1325 : * für dieses Dokument.
1326 : * Der Timestamp wird nur geändert, wenn sich der Kommentar auch geändert hat oder der Status
1327 : * gesetzt oder aufgehoben wurde.
1328 : *
1329 : * @access public
1330 : * @param int $ts Timestamp
1331 : * @param int $until Timestamp der Deadline zur Überarbeitung
1332 : * @param string $comment Kommentar
1333 : * @return boolean Erfolgswert
1334 : */
1335 : function setReviseUntil($ts, $until, $comment) {
1336 0 : global $db, $settings;
1337 0 : $dbp = $settings["dbPrefix"];
1338 0 : $comment = trim($comment);
1339 0 : if (!(($this->reviseTS == 0 && $ts > 0) || ($this->reviseTS > 0 && $ts == 0)) && $this->reviseComment == Data::gpcUnescape($comment)) {
1340 0 : $ts = $this->reviseTS; // Timestamp nicht ändern, wenn der Kommentar nicht geändert wird
1341 :
1342 0 : }
1343 0 : if ($this->reviseUntil == $until && $this->reviseComment == Data::gpcUnescape($comment)) {
1344 0 : return true;
1345 : }
1346 0 : if ($this->ID == 0) {
1347 0 : if (!$this->createDocument()) {
1348 0 : return false;
1349 : }
1350 0 : }
1351 0 : if (empty($comment)) {
1352 0 : $commentSQL = "NULL";
1353 0 : } else {
1354 0 : $commentSQL = "'".Data::toMysql($comment) ."'";
1355 : }
1356 0 : $db->query("UPDATE {$dbp}planspiel_document SET revise_until='$until', revise_comment=$commentSQL, revise_ts='$ts' WHERE id='$this->ID'");
1357 0 : if ($db->rows_affected) {
1358 0 : $this->reviseUntil = intval($until);
1359 0 : $this->reviseComment = Data::gpcUnescape($comment);
1360 0 : $this->reviseTS = intval($ts);
1361 0 : return true;
1362 : }
1363 0 : return false;
1364 : }
1365 : /**
1366 : * Speichert den übergebenen Timestamp und den Kommentar als neuen "Change Request"-Status
1367 : * für dieses Dokument.
1368 : * Der Timestamp wird nur geändert, wenn sich der Kommentar auch geändert hat oder der Status
1369 : * gesetzt oder aufgehoben wurde.
1370 : *
1371 : * @access public
1372 : * @param int $ts Timestamp
1373 : * @param string $comment Kommentar
1374 : * @return boolean Erfolgswert
1375 : */
1376 : function setChangeRequest($ts, $comment) {
1377 0 : global $db, $settings;
1378 0 : $dbp = $settings["dbPrefix"];
1379 0 : $comment = trim($comment);
1380 0 : if (!(($this->changeRequestSince == 0 && $ts > 0) || ($this->changeRequestSince > 0 && $ts == 0)) && $this->changeRequestComment == Data::gpcUnescape($comment)) {
1381 0 : $ts = $this->changeRequestSince; // Timestamp nicht ändern, wenn der Kommentar nicht geändert wird
1382 :
1383 0 : }
1384 0 : if ($this->changeRequestSince == $ts && $this->changeRequestComment == Data::gpcUnescape($comment)) {
1385 0 : return true;
1386 : }
1387 0 : if ($this->ID == 0) {
1388 0 : if (!$this->createDocument()) {
1389 0 : return false;
1390 : }
1391 0 : }
1392 0 : if (empty($comment)) {
1393 0 : $commentSQL = "NULL";
1394 0 : } else {
1395 0 : $commentSQL = "'".Data::toMysql($comment) ."'";
1396 : }
1397 0 : $db->query("UPDATE {$dbp}planspiel_document SET change_request='$ts', change_req_comment=$commentSQL WHERE id='$this->ID'");
1398 0 : if ($db->rows_affected) {
1399 0 : $this->changeRequestSince = intval($ts);
1400 0 : $this->changeRequestComment = Data::gpcUnescape($comment);
1401 0 : return true;
1402 : }
1403 0 : return false;
1404 : }
1405 : /**
1406 : * Speichert die übergebene Zahl als neue Aufwandsabschätzung für dieses Dokument.
1407 : * Die Zahl sollte vorher mit der Methode validateEstimatedEffort() validiert worden sein!
1408 : *
1409 : * @access public
1410 : * @param float $days Anzahl Personentage
1411 : * @return boolean Erfolgswert
1412 : */
1413 : function setEstimatedEffort($days) {
1414 0 : global $db, $settings;
1415 0 : $dbp = $settings["dbPrefix"];
1416 0 : $days = trim($days);
1417 0 : if ($this->estimatedEffort == Data::gpcUnescape($days)) {
1418 0 : return true;
1419 : }
1420 0 : if ($this->ID == 0) {
1421 0 : if (!$this->createDocument()) {
1422 0 : return false;
1423 : }
1424 0 : }
1425 0 : $time = time();
1426 0 : $db->query("UPDATE {$dbp}planspiel_document SET estimated_effort='".Data::toMysql($days) ."', estimated_effort_ts='$time' WHERE id='$this->ID'");
1427 0 : if ($db->rows_affected) {
1428 0 : $this->estimatedEffort = floatval($days);
1429 0 : $this->estimatedEffortTS = $time;
1430 0 : return true;
1431 : }
1432 0 : return false;
1433 : }
1434 : /**
1435 : * Speichert die übergebene Zahl als neue Angabe des bisherigen Aufwands für dieses Dokument.
1436 : * Die Zahl sollte vorher mit der Methode validateDaysSpent() validiert worden sein!
1437 : *
1438 : * @access public
1439 : * @param float $days Anzahl Personentage
1440 : * @return boolean Erfolgswert
1441 : */
1442 : function setDaysSpent($days) {
1443 0 : global $db, $settings;
1444 0 : $dbp = $settings["dbPrefix"];
1445 0 : $days = trim($days);
1446 0 : if ($this->daysSpent == Data::gpcUnescape($days)) {
1447 0 : return true;
1448 : }
1449 0 : if ($this->ID == 0) {
1450 0 : if (!$this->createDocument()) {
1451 0 : return false;
1452 : }
1453 0 : }
1454 0 : $time = time();
1455 0 : $db->query("UPDATE {$dbp}planspiel_document SET days_spent='".Data::toMysql($days) ."', days_spent_ts='$time' WHERE id='$this->ID'");
1456 0 : if ($db->rows_affected) {
1457 0 : $this->daysSpent = floatval($days);
1458 0 : $this->daysSpentTS = $time;
1459 0 : return true;
1460 : }
1461 0 : return false;
1462 : }
1463 : /**
1464 : * Speichert die übergebene Zahl als neuen ETC für dieses Dokument.
1465 : * Die Zahl sollte vorher mit der Methode validateETC() validiert worden sein!
1466 : *
1467 : * @access public
1468 : * @param float $days Anzahl Personentage
1469 : * @return boolean Erfolgswert
1470 : */
1471 : function setETC($days) {
1472 0 : global $db, $settings;
1473 0 : $dbp = $settings["dbPrefix"];
1474 0 : $days = trim($days);
1475 0 : if ($this->etc == Data::gpcUnescape($days)) {
1476 0 : return true;
1477 : }
1478 0 : if ($this->ID == 0) {
1479 0 : if (!$this->createDocument()) {
1480 0 : return false;
1481 : }
1482 0 : }
1483 0 : $time = time();
1484 0 : $db->query("UPDATE {$dbp}planspiel_document SET etc='".Data::toMysql($days) ."', etc_ts='$time' WHERE id='$this->ID'");
1485 0 : if ($db->rows_affected) {
1486 0 : $this->etc = floatval($days);
1487 0 : $this->etcTS = $time;
1488 0 : return true;
1489 : }
1490 0 : return false;
1491 : }
1492 : /**
1493 : * Speichert den übergebenen Timestamp und den Kommentar als neuen "In Bearbeitung"-Status
1494 : * für dieses Dokument.
1495 : * Der Timestamp wird nur geändert, wenn sich der Kommentar auch geändert hat oder der Status
1496 : * gesetzt oder aufgehoben wurde.
1497 : *
1498 : * @access public
1499 : * @param int $ts Timestamp
1500 : * @param string $comment Kommentar
1501 : * @return boolean Erfolgswert
1502 : */
1503 : function setInProgress($ts, $comment) {
1504 0 : global $db, $settings;
1505 0 : $dbp = $settings["dbPrefix"];
1506 0 : $comment = trim($comment);
1507 0 : if (!(($this->inProgressSince == 0 && $ts > 0) || ($this->inProgressSince > 0 && $ts == 0)) && $this->inProgressComment == Data::gpcUnescape($comment)) {
1508 0 : $ts = $this->inProgressSince; // Timestamp nicht ändern, wenn der Kommentar nicht geändert wird
1509 :
1510 0 : }
1511 0 : if ($this->inProgressSince == $ts && $this->inProgressComment == Data::gpcUnescape($comment)) {
1512 0 : return true;
1513 : }
1514 0 : if ($this->ID == 0) {
1515 0 : if (!$this->createDocument()) {
1516 0 : return false;
1517 : }
1518 0 : }
1519 0 : if (empty($comment)) {
1520 0 : $commentSQL = "NULL";
1521 0 : } else {
1522 0 : $commentSQL = "'".Data::toMysql($comment) ."'";
1523 : }
1524 0 : $db->query("UPDATE {$dbp}planspiel_document SET in_progress='$ts', progress_comment=$commentSQL WHERE id='$this->ID'");
1525 0 : if ($db->rows_affected) {
1526 0 : $this->inProgressSince = intval($ts);
1527 0 : $this->inProgressComment = Data::gpcUnescape($comment);
1528 0 : return true;
1529 : }
1530 0 : return false;
1531 : }
1532 : /**
1533 : * Speichert den übergebenen Timestamp und den Kommentar als neuen "Bereit zur Abnahme"-Status
1534 : * für dieses Dokument.
1535 : * Der Timestamp wird nur geändert, wenn sich der Kommentar auch geändert hat oder der Status
1536 : * gesetzt oder aufgehoben wurde.
1537 : *
1538 : * @access public
1539 : * @param int $ts Timestamp
1540 : * @param string $comment Kommentar
1541 : * @return boolean Erfolgswert
1542 : */
1543 : function setReadyForApproval($ts, $comment) {
1544 0 : global $db, $settings;
1545 0 : $dbp = $settings["dbPrefix"];
1546 0 : $comment = trim($comment);
1547 0 : if (!(($this->readyForApprovalSince == 0 && $ts > 0) || ($this->readyForApprovalSince > 0 && $ts == 0)) && $this->readyForApprovalComment == Data::gpcUnescape($comment)) {
1548 0 : $ts = $this->readyForApprovalSince; // Timestamp nicht ändern, wenn der Kommentar nicht geändert wird
1549 :
1550 0 : }
1551 0 : if ($this->readyForApprovalSince == $ts && $this->readyForApprovalComment == Data::gpcUnescape($comment)) {
1552 0 : return true;
1553 : }
1554 0 : if ($this->ID == 0) {
1555 0 : if (!$this->createDocument()) {
1556 0 : return false;
1557 : }
1558 0 : }
1559 0 : if (empty($comment)) {
1560 0 : $commentSQL = "NULL";
1561 0 : } else {
1562 0 : $commentSQL = "'".Data::toMysql($comment) ."'";
1563 : }
1564 0 : $db->query("UPDATE {$dbp}planspiel_document SET ready_for_approval='$ts', approval_comment=$commentSQL WHERE id='$this->ID'");
1565 0 : if ($db->rows_affected) {
1566 0 : $this->readyForApprovalSince = intval($ts);
1567 0 : $this->readyForApprovalComment = Data::gpcUnescape($comment);
1568 0 : return true;
1569 : }
1570 0 : return false;
1571 : }
1572 : /**
1573 : * Speichert den übergebenen Timestamp und den Kommentar als neuen "Feedback erbeten"-Status
1574 : * für dieses Dokument.
1575 : * Der Timestamp wird nur geändert, wenn sich der Kommentar auch geändert hat oder der Status
1576 : * gesetzt oder aufgehoben wurde.
1577 : *
1578 : * @access public
1579 : * @param int $ts Timestamp
1580 : * @param string $comment Kommentar
1581 : * @return boolean Erfolgswert
1582 : */
1583 : function setFeedbackRequest($ts, $comment) {
1584 0 : global $db, $settings;
1585 0 : $dbp = $settings["dbPrefix"];
1586 0 : $comment = trim($comment);
1587 0 : if (!(($this->feedbackRequestSince == 0 && $ts > 0) || ($this->feedbackRequestSince > 0 && $ts == 0)) && $this->feedbackRequestComment == Data::gpcUnescape($comment)) {
1588 0 : $ts = $this->feedbackRequestSince; // Timestamp nicht ändern, wenn der Kommentar nicht geändert wird
1589 :
1590 0 : }
1591 0 : if ($this->feedbackRequestSince == $ts && $this->feedbackRequestComment == Data::gpcUnescape($comment)) {
1592 0 : return true;
1593 : }
1594 0 : if ($this->ID == 0) {
1595 0 : if (!$this->createDocument()) {
1596 0 : return false;
1597 : }
1598 0 : }
1599 0 : if (empty($comment)) {
1600 0 : $commentSQL = "NULL";
1601 0 : } else {
1602 0 : $commentSQL = "'".Data::toMysql($comment) ."'";
1603 : }
1604 0 : $db->query("UPDATE {$dbp}planspiel_document SET feedback_requested='$ts', feedback_comment=$commentSQL WHERE id='$this->ID'");
1605 0 : if ($db->rows_affected) {
1606 0 : $this->feedbackRequestSince = intval($ts);
1607 0 : $this->feedbackRequestComment = Data::gpcUnescape($comment);
1608 0 : return true;
1609 : }
1610 0 : return false;
1611 : }
1612 : /**
1613 : * Speichert eine hochgeladene Datei in den Ressourcen und setzt die Datei-ID dieses Dokuments.
1614 : * Eine bereits zu diesem Dokument hochgeladene Datei wird vorher gelöscht.
1615 : *
1616 : * @access public
1617 : * @return boolean Erfolgswert
1618 : */
1619 : function setFile() {
1620 0 : global $db, $settings;
1621 0 : $dbp = $settings["dbPrefix"];
1622 0 : if ($this->fileID > 0) {
1623 : // Alte Datei löschen
1624 0 : $filem = new Filemanager();
1625 0 : $file = $db->get_row("SELECT * FROM {$dbp}filelist WHERE fileID='$this->fileID'");
1626 0 : if (!is_null($file)) {
1627 0 : $file->userID = $_SESSION["userid"]; // Gegen Probleme mit Zugriffsrechten
1628 0 : $filem->runAction($file, 0, "delete_trueFile", $this->fileID, $this->folderID);
1629 0 : }
1630 : // Akzeptiert-Status wieder löschen
1631 0 : $this->setAccepted(0, "");
1632 0 : }
1633 0 : $insert = new Insert();
1634 0 : $data = array("link" => $_SESSION['userid'].time() .$_SESSION['course'], "name" => $this->name, "size" => $_FILES["upload"]["size"], "userID" => $_SESSION["userid"], "create_time" => time(), "courseID" => $this->courseID, "description" => $this->description, "type" => "file", "visible_type" => 1, // Sichtbarkeit: Alle
1635 0 : "start_time" => 0, "end_time" => 2147483647, "parent_object" => $this->folderID, "orig_filename" => $_FILES["upload"]["name"], "tmpfileTmpName" => $_FILES["upload"]["tmp_name"], "extension" => (string)substr(strrchr($_FILES["upload"]["name"], "."), 1, strlen($_FILES["upload"]["name"])), "tmpemail" => false, "tmpteacherEMail" => false,);
1636 0 : ob_start(); // Ausgabe der Insert-Klasse verwerfen
1637 0 : $fileID = $insert->resolveForm($data);
1638 0 : ob_end_clean();
1639 0 : if ($fileID) {
1640 0 : $db->query("UPDATE {$dbp}planspiel_document SET file_id='$fileID' WHERE id='$this->ID'");
1641 0 : if ($db->rows_affected) {
1642 0 : $this->fileID = intval($fileID);
1643 0 : return true;
1644 : }
1645 0 : }
1646 0 : return false;
1647 : }
1648 : /**
1649 : * Gibt die ID dieses Dokuments zurück.
1650 : *
1651 : * @access public
1652 : * @return int ID des Dokuments
1653 : */
1654 : function getID() {
1655 0 : return $this->ID;
1656 : }
1657 : /**
1658 : * Gibt den Namen dieses Dokuments zurück.
1659 : *
1660 : * @access public
1661 : * @return string Name des Dokuments
1662 : */
1663 : function getName() {
1664 0 : return $this->name;
1665 : }
1666 : /**
1667 : * Gibt die Beschreibung dieses Dokuments zurück.
1668 : *
1669 : * @access public
1670 : * @param boolean $bbcode Gibt an, ob BBCode im Text bereits umgewandelt werden soll.
1671 : * @return string Beschreibung des Dokuments
1672 : */
1673 : function getDescription($bbcode = true) {
1674 0 : if ($bbcode) {
1675 0 : $bb = new BBCode();
1676 0 : return $bb->parse($this->description);
1677 : }
1678 0 : return $this->description;
1679 : }
1680 : /**
1681 : * Gibt den Kommentar zum Change Request dieses Dokuments zurück.
1682 : *
1683 : * @access public
1684 : * @param boolean $bbcode Gibt an, ob BBCode im Text bereits umgewandelt werden soll.
1685 : * @return string Kommentar
1686 : */
1687 : function getChangeRequestComment($bbcode = true) {
1688 0 : if ($bbcode) {
1689 0 : $bb = new BBCode();
1690 0 : return $bb->parse($this->changeRequestComment);
1691 : }
1692 0 : return $this->changeRequestComment;
1693 : }
1694 : /**
1695 : * Gibt den Kommentar zum Akzeptiert-Status dieses Dokuments zurück.
1696 : *
1697 : * @access public
1698 : * @param boolean $bbcode Gibt an, ob BBCode im Text bereits umgewandelt werden soll.
1699 : * @return string Kommentar
1700 : */
1701 : function getAcceptedComment($bbcode = true) {
1702 0 : if ($bbcode) {
1703 0 : $bb = new BBCode();
1704 0 : return $bb->parse($this->acceptedComment);
1705 : }
1706 0 : return $this->acceptedComment;
1707 : }
1708 : /**
1709 : * Gibt den Kommentar zum Überarbeitungs-Status dieses Dokuments zurück.
1710 : *
1711 : * @access public
1712 : * @param boolean $bbcode Gibt an, ob BBCode im Text bereits umgewandelt werden soll.
1713 : * @return string Kommentar
1714 : */
1715 : function getReviseComment($bbcode = true) {
1716 0 : if ($bbcode) {
1717 0 : $bb = new BBCode();
1718 0 : return $bb->parse($this->reviseComment);
1719 : }
1720 0 : return $this->reviseComment;
1721 : }
1722 : /**
1723 : * Gibt den Kommentar zum "In Bearbeitung"-Status dieses Dokuments zurück.
1724 : *
1725 : * @access public
1726 : * @param boolean $bbcode Gibt an, ob BBCode im Text bereits umgewandelt werden soll.
1727 : * @return string Kommentar
1728 : */
1729 : function getInProgressComment($bbcode = true) {
1730 0 : if ($bbcode) {
1731 0 : $bb = new BBCode();
1732 0 : return $bb->parse($this->inProgressComment);
1733 : }
1734 0 : return $this->inProgressComment;
1735 : }
1736 : /**
1737 : * Gibt den Kommentar zum "Bereit zur Abnahme"-Status dieses Dokuments zurück.
1738 : *
1739 : * @access public
1740 : * @param boolean $bbcode Gibt an, ob BBCode im Text bereits umgewandelt werden soll.
1741 : * @return string Kommentar
1742 : */
1743 : function getReadyForApprovalComment($bbcode = true) {
1744 0 : if ($bbcode) {
1745 0 : $bb = new BBCode();
1746 0 : return $bb->parse($this->readyForApprovalComment);
1747 : }
1748 0 : return $this->readyForApprovalComment;
1749 : }
1750 : /**
1751 : * Gibt den Kommentar zum Feedback Request dieses Dokuments zurück.
1752 : *
1753 : * @access public
1754 : * @param boolean $bbcode Gibt an, ob BBCode im Text bereits umgewandelt werden soll.
1755 : * @return string Kommentar
1756 : */
1757 : function getFeedbackRequestComment($bbcode = true) {
1758 0 : if ($bbcode) {
1759 0 : $bb = new BBCode();
1760 0 : return $bb->parse($this->feedbackRequestComment);
1761 : }
1762 0 : return $this->feedbackRequestComment;
1763 : }
1764 : /**
1765 : * Gibt den Namen, Rolle und Teamzugehörigkeit des Bearbeiters dieses Dokuments zurück.
1766 : * Der Name ist verlinkt auf das Profil des Benutzers, die Rolle auf deren Eigenschaftenseite.
1767 : *
1768 : * @access public
1769 : * @return string HTML-String mit Angaben zum Bearbeiter
1770 : */
1771 : function getEditor() {
1772 0 : global $db, $settings;
1773 0 : $dbp = $settings["dbPrefix"];
1774 0 : $urm = new UserRoleManagement($this->courseID);
1775 0 : $utm = new UserTeamManagement($this->courseID);
1776 0 : $editor = "<a href='".PATH_TO_ROOT."user/homepage.php?user=$this->editorUserID'>".Data::toHTML($db->get_var("SELECT CONCAT(Nachname, ', ', Vorname) FROM {$dbp}user WHERE ID='$this->editorUserID'"), false) ."</a>";
1777 0 : $team = $utm->getTeamOfUser($this->editorUserID);
1778 : // if (is_a($team, "Team")) {
1779 : // $editor.= " (".Data::toHTML($team->getName(), false) .")";
1780 : // }
1781 0 : return $editor;
1782 : }
1783 : /**
1784 : * Gibt die ID der zum Dokument gehörenden Datei zurück.
1785 : *
1786 : * @access public
1787 : * @return int Datei-ID des Ressourcenmanagers
1788 : */
1789 : function getFileID() {
1790 0 : return $this->fileID;
1791 : }
1792 : /**
1793 : * Gibt den Namen, Rolle und Teamzugehörigkeit des Reviewers dieses Dokuments zurück.
1794 : * Der Name ist verlinkt auf das Profil des Benutzers, die Rolle auf deren Eigenschaftenseite.
1795 : *
1796 : * @access public
1797 : * @return string HTML-String mit Angaben zum Reviewer
1798 : */
1799 : function getReviewer() {
1800 0 : global $db, $settings;
1801 0 : $dbp = $settings["dbPrefix"];
1802 0 : $urm = new UserRoleManagement($this->courseID);
1803 0 : $utm = new UserTeamManagement($this->courseID);
1804 0 : $reviewer = "<a href='".PATH_TO_ROOT."user/homepage.php?user=$this->reviewerUserID'>".Data::toHTML($db->get_var("SELECT CONCAT(Nachname, ', ', Vorname) FROM {$dbp}user WHERE ID='$this->reviewerUserID'"), false) ."</a>";
1805 0 : $team = $utm->getTeamOfUser($this->editorUserID);
1806 : // if (is_a($team, "Team")) {
1807 : // $reviewer.= " (".Data::toHTML($team->getName(), false) .")";
1808 : // }
1809 0 : return $reviewer;
1810 : }
1811 : /**
1812 : * Gibt die User-ID des Reviewers dieses Dokuments zurück.
1813 : *
1814 : * @access public
1815 : * @return int User-ID des Reviewers
1816 : */
1817 : function getReviewerUserID() {
1818 0 : return $this->reviewerUserID;
1819 : }
1820 : /**
1821 : * Gibt die User-ID des Bearbeiters dieses Dokuments zurück.
1822 : *
1823 : * @access public
1824 : * @return int User-ID des Bearbeiters
1825 : */
1826 : function getEditorUserID() {
1827 0 : return $this->editorUserID;
1828 : }
1829 : /**
1830 : * Gibt den Typnamen dieses Dokuments zurück.
1831 : *
1832 : * @access public
1833 : * @return string Typname des Dokuments
1834 : */
1835 : function getTypeName() {
1836 0 : global $db, $settings;
1837 0 : $dbp = $settings["dbPrefix"];
1838 0 : return strval($db->get_var("SELECT name FROM {$dbp}planspiel_doc_type WHERE id='$this->type'"));
1839 : }
1840 : /**
1841 : * Gibt den Vorlagen-Namen dieses Dokuments zurück.
1842 : *
1843 : * @access public
1844 : * @return string Vorlagen-Name des Dokuments
1845 : */
1846 : function getTemplateName() {
1847 0 : global $db, $settings;
1848 0 : $dbp = $settings["dbPrefix"];
1849 0 : return strval($db->get_var("SELECT name FROM {$dbp}filelist WHERE fileID='$this->templateID'"));
1850 : }
1851 : /**
1852 : * Gibt den Status dieses Dokuments als String zurück.
1853 : *
1854 : * @access public
1855 : * @return string Status des Dokuments
1856 : */
1857 : function getStatusText() {
1858 0 : $max = max($this->inProgressSince, $this->readyForApprovalSince, $this->feedbackRequestSince, $this->acceptedSince, $this->reviseTS, $this->changeRequestSince);
1859 0 : if ($max == 0) {
1860 0 : return "Noch nicht begonnen";
1861 0 : } elseif ($this->inProgressSince == $max) {
1862 0 : return "In Bearbeitung";
1863 0 : } elseif ($this->readyForApprovalSince == $max) {
1864 0 : return "Bereit zur Abnahme";
1865 0 : } elseif ($this->feedbackRequestSince == $max) {
1866 0 : return "Feedback erwünscht";
1867 0 : } elseif ($this->acceptedSince == $max) {
1868 0 : return "Akzeptiert";
1869 0 : } elseif ($this->reviseTS == $max) {
1870 0 : return "Überarbeitung erwünscht";
1871 0 : } elseif ($this->changeRequestSince == $max) {
1872 0 : return "Change Request";
1873 : }
1874 0 : }
1875 : /**
1876 : * Gibt den geschätzten Aufwand in PT zurück.
1877 : *
1878 : * @access public
1879 : * @return float Personentage
1880 : */
1881 : function getEstimatedEffort() {
1882 0 : return number_format($this->estimatedEffort, 2);
1883 : }
1884 : /**
1885 : * Gibt die bisher aufgewendeten PT zurück.
1886 : *
1887 : * @access public
1888 : * @return float Personentage
1889 : */
1890 : function getDaysSpent() {
1891 0 : return number_format($this->daysSpent, 2);
1892 : }
1893 : /**
1894 : * Gibt die ETC in PT zurück.
1895 : *
1896 : * @access public
1897 : * @return float Personentage
1898 : */
1899 : function getETC() {
1900 0 : return number_format($this->etc, 2);
1901 : }
1902 : /**
1903 : * Gibt zurück, ob die Bearbeitung dieses Dokuments abgeschlossen ist.
1904 : * Das ist der Fall, sobald das Dokument als akzeptiert markiert wurde.
1905 : *
1906 : * @access public
1907 : * @return boolean true, wenn das Dokument akzeptiert wurde, sonst false
1908 : */
1909 : function isFinished() {
1910 0 : return $this->acceptedSince > 0;
1911 : }
1912 : /**
1913 : * Gibt einen Link zum Download der zum Dokument gehörenden Datei aus, wenn diese
1914 : * vorhanden ist, sonst nur den Namen des Dokuments.
1915 : *
1916 : * @access public
1917 : * @return string Download-Link zur Datei
1918 : */
1919 : function getLinkToFile() {
1920 0 : if ($this->fileID > 0) {
1921 0 : return "<a href='".PATH_TO_ROOT."ressourcen/filemanager.php?activeFolder=$this->folderID&action=getfile&actionID=$this->fileID' title='Datei herunterladen'>".Data::toHTML($this->name, false) ."</a>";
1922 : }
1923 0 : return Data::toHTML($this->name, false);
1924 : }
1925 : }
|